HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/dashboard.orbiwheels.com/app/Http/Controllers/Admin/TransporterController.php
<?php

namespace App\Http\Controllers\Admin;

use App\DataTables\Admin\TransporterDataTable;
use App\DataTables\Admin\TransporterRequestDataTable;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\TransporterRequest;
use App\Models\Document;
use App\Models\Transporter;
use App\Models\TransporterRequest as ModelsTransporterRequest;
use App\Models\TransporterSetting;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;

class TransporterController extends Controller
{
    public function index(TransporterDataTable $dataTable)
    {
        if (!auth()->user()->can('transporter.view')) {
            abort(403, 'You do not have permission to view transporters.');
        }
        return $dataTable->render('admin.transporter.index');
    }
    public function requestIndex(TransporterRequestDataTable $dataTable)
    {
        if (!auth()->user()->can('transporter.view')) {
            abort(403, 'You do not have permission to view transporters.');
        }
        return $dataTable->render('admin.transporter.requestIndex');
    }


    public function create(Request $request)
    {
        if (!auth()->user()->can('transporter.create')) {
            abort(403, 'You do not have permission to create transporter.');
        }
        return view('admin.transporter.create');
    }


    public function store(TransporterRequest $request)
    {
        $transporter = new Transporter();
        $transporter->company_name = $request->company_name;
        $transporter->contact_person = $request->contact_person;
        $transporter->first_name = $request->first_name;
        $transporter->last_name = $request->last_name;
        $transporter->email = $request->email;
        $transporter->phone = $request->phone;
        $transporter->status =  $request->status;
        $transporter->password = Hash::make($request->password);
        $transporter->address          = $request->address;
        $transporter->transporter_type = $request->transporter_type;
        $transporter->ride_permissions = $request->input('ride_permissions', []);
        if ($request->hasFile('image')) {
            $transporter->image = $request->file('image')->store("uploads/transporter/temp", 'public');
        }

        $transporter->save();

        if ($transporter->image) {
            $path = str_replace("temp", $transporter->id, $transporter->image);
            Storage::disk('public')->move($transporter->image, $path);
            $transporter->image = $path;
            $transporter->save();
        }

        $documents = $request->file('documents', []);
        $docNumbers = $request->input('doc_numbers', []);

        foreach (['aadhaar', 'pan', 'gst'] as $type) {
            $file = $documents[$type] ?? null;
            $docNumber = $docNumbers[$type] ?? null;

            if ($file || $docNumber) {
                $path = $file ? $file->store("uploads/transporters/{$transporter->id}", 'public') : null;

                $transporter->documents()->create([
                    'doc_type' => $type,
                    'doc_number' => $docNumber,
                    'file_url' => $path,
                ]);
            }
        }

        if ($request->has('settings')) {
            foreach ($request->settings as $key => $value) {
                TransporterSetting::updateOrCreate(
                    [
                        'transporter_id' => $transporter->id,
                        'key' => $key,
                    ],
                    [
                        'value' => $value ? 1 : 0,
                    ]
                );
            }
        }
        $transporter->refreshVerificationStatus();
        return redirect()->route('admin.transporter.index')->with('success', 'Transporter created successfully!');
    }

    public function view(string $id)
    {
        $transporter = Transporter::with('documents')->find($id);
        if (!isset($transporter)) {
            return redirect()->route('admin.transporter.index')->with('error', 'Transporter not found!');
        }
        $progress = 0;

        $hasVerifiedDocs = $transporter->documents()->where('is_verified', 1)->count() > 0
            && $transporter->documents()->where('is_verified', 0)->count() == 0;

        if ($hasVerifiedDocs) {
            $progress += 50;
        }

        $hasVerifiedDriver = $transporter->drivers()->where('is_verified', 1)->exists();
        if ($hasVerifiedDriver) {
            $progress += 25;
        }

        $hasVerifiedVehicle = $transporter->vehicles()->where('is_verified', 1)->exists();
        if ($hasVerifiedVehicle) {
            $progress += 25;
        }

        // dd($transporter);
        return view('admin.transporter.view', compact(['transporter','progress']));
    }
    public function edit(Request $request, $id)
    {
        if (!auth()->user()->can('transporter.edit')) {
            abort(403, 'You do not have permission to edit transporter.');
        }
        $transporter = Transporter::with(['documents', 'settings'])->find($id);
        if (!isset($transporter)) {
            return redirect()->route('admin.transporter.index')->with('error', 'Transporter not found!');
        }
        $documents = $transporter->documents->keyBy('doc_type');
        return view('admin.transporter.edit', compact('transporter', 'documents'));
    }


    public function update(TransporterRequest $request, $id)
    {
        // dd($request->all());
        $transporter = Transporter::with('documents')->find($id);
        $transporter->company_name = $request->company_name;
        $transporter->contact_person = $request->contact_person;
        $transporter->first_name = $request->first_name;
        $transporter->last_name = $request->last_name;
        $transporter->email = $request->email;
        $transporter->phone = $request->phone;
        $transporter->status =  $request->status;
        $transporter->address          = $request->address;
        $transporter->transporter_type = $request->transporter_type;
        $transporter->ride_permissions = $request->input('ride_permissions', []);
        if ($request->hasFile('image')) {
            if ($transporter->image && Storage::disk('public')->exists($transporter->image)) {
                Storage::disk('public')->delete($transporter->image);
            }
            $transporter->image = $request->file('image')
                ->store("uploads/transporter/{$transporter->id}", 'public');
        }
        $transporter->update();

        $documents = $request->file('documents', []);
        $docNumbers = $request->input('doc_numbers', []);

        foreach (['aadhaar', 'pan', 'gst'] as $type) {
            $file = $documents[$type] ?? null;
            $docNumber = $docNumbers[$type] ?? null;

            if (!$file && !$docNumber) continue;

            $document = $transporter->documents()->where('doc_type', $type)->first();

            $path = $file ? $file->store("uploads/transporters/{$transporter->id}", 'public') : null;

            if ($document) {
                $document->update([
                    'doc_number'  => $docNumber ?? $document->doc_number,
                    'file_url'    => $path ?? $document->file_url,
                    'uploaded_at' => now(),
                ]);
            } else {
                $transporter->documents()->create([
                    'doc_type'    => $type,
                    'doc_number'  => $docNumber,
                    'file_url'    => $path,
                    'uploaded_at' => now(),
                ]);
            }
        }
        if ($request->has('settings')) {
            foreach ($request->settings as $key => $value) {
                TransporterSetting::updateOrCreate(
                    [
                        'transporter_id' => $transporter->id,
                        'key' => $key,
                    ],
                    [
                        'value' => $value ?? 0,
                    ]
                );
            }
        }
        $transporter->refreshVerificationStatus();
        return redirect()->route('admin.transporter.index')->with('success', 'Transporter updated successfully!');
    }


    public function delete(Request $request, $id)
    {

        $transporter = Transporter::find($id);
        if (!isset($transporter)) {
            return response()->json([
                'status' => false,
                'message' => 'Transporter not found!',
            ]);
        }
        foreach ($transporter->documents as $document) {
            if ($document->file_url && Storage::disk('public')->exists($document->file_url)) {
                Storage::disk('public')->delete($document->file_url);
            }
            $document->delete();
        }
        $transporter->delete();

        return response()->json([
            'status' => true,
            'message' => 'Transporter deleted successfully!',
        ]);
    }
    public function requestStatus($id, $status)
    {
        $request = ModelsTransporterRequest::findOrFail($id);

        if (!in_array($status, [0, 1, 2])) {
            return response()->json([
                'status' => false,
                'message' => 'Invalid status.'
            ]);
        }

        $request->status = $status;
        $request->save();

        return response()->json([
            'status' => true,
            'message' => 'Request status updated successfully.'
        ]);
    }

    public function requestDestroy($id)
    {
        $request = ModelsTransporterRequest::findOrFail($id);

        $request->delete();

        return response()->json([
            'status' => true,
            'message' => 'Request deleted successfully.'
        ]);
    }

    public function verify(Request $request, $id)
    {
        $transporter = Transporter::with(['documents', 'drivers', 'vehicles'])->findOrFail($id);

        if ($request->status == 1) {

            $allDocumentsVerified =
                $transporter->documents->count() > 0 &&
                $transporter->documents->where('is_verified', 0)->count() == 0;

            if (! $allDocumentsVerified) {
                return response()->json([
                    'message' => 'All documents must be verified before verifying the transporter.'
                ], 422);
            }
            $hasVerifiedDriver = $transporter->drivers()->where('is_verified', 1)->exists();
            $hasVerifiedVehicle = $transporter->vehicles()->where('is_verified', 1)->exists();

            if (! $hasVerifiedDriver && ! $hasVerifiedVehicle) {
                return response()->json([
                    'message' => 'At least one verified driver and one verified vehicle are required before verifying the transporter.'
                ], 422);
            }

            if (! $hasVerifiedDriver) {
                return response()->json([
                    'message' => 'At least one verified driver is required before verifying the transporter.'
                ], 422);
            }

            if (! $hasVerifiedVehicle) {
                return response()->json([
                    'message' => 'At least one verified vehicle is required before verifying the transporter.'
                ], 422);
            }
        }

        $transporter->is_verified = $request->status == 1;
        $transporter->save();

        return response()->json(['message' => 'Transporter verification status updated successfully!']);
    }
    public function deleteDocument(string $id)
    {
        $doc = Document::findOrFail($id);
        if ($doc->file_url && Storage::disk('public')->exists($doc->file_url)) {
            Storage::disk('public')->delete($doc->file_url);
        }

        $doc->delete();

        return response()->json(['success' => true, 'message' => 'Document deleted successfully.']);
    }
    public function verifyDocument($id)
    {
        $document = Document::findOrFail($id);
        $document->is_verified = 1;
        $document->save();

        return response()->json(['message' => 'Document verified successfully!']);
    }
}